package com.sxj.corejava.code08_常用类.内部类;

/**
 * @author 石小俊
 * @date 2024年04月23日 19:37
 */
public class Test02_局部内部类 {

    public static void main(String[] args) {
        OuterTwo outer = new OuterTwo();
        outer.show();
        // 由于局部内部类是属于外部类的方法的
        // 因此,在对应方法以外的地方均无法实例化内部类
    }

}

class OuterTwo {
    private String name = "admin";
    private int age = 20;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void test() {
        // 此处也无法实例化局部内部类
    }

    public void show() {
        final String phone = "13812345678";

        // 定义在方法中的类,称之为局部内部类
        class InnerTwo {
            private String name = "alice";
            private String gender = "男";

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public String getGender() {
                return gender;
            }

            public void setGender(String gender) {
                this.gender = gender;
            }

            public void print() {
                // 对于同名属性,默认访问内部类的
                System.out.println("name属性:" + name);
                // 对于不同名属性,正常访问
                System.out.println("age属性:" + age);
                // 想要访问同名的外部类属性
                OuterTwo outer = new OuterTwo();
                System.out.println("访问外部类name属性:" + outer.name);
                // 在内部类中访问内部类所在的方法中的属性时,只能访问final修饰的属性
                // 即:只能访问常量
                // 在JDK8之前,访问的属性必须通过final修饰
                // 从JDK8开始,访问的属性会自动添加final
                System.out.println("访问内部类所在方法中的属性:" + phone);
                // 当变量被final修饰之后,表示当前变量为不可变量,其值不能发生改变
                // 因此,修改属性的时候会编译报错
//                phone = "13912345679";
            }

        }
        System.out.println("********************外部类方法内容********************");
        InnerTwo inner = new InnerTwo();
        inner.print();
        System.out.println(inner.name);
        System.out.println(inner.gender);
    }

}
